Medium
Given a linked list, rotate the list to the right by k places, where k is non-negative.
Example 1:
1 | Input: 1->2->3->4->5->NULL, k = 2 |
Example 2:
1 | Input: 0->1->2->NULL, k = 4 |
- 使用start每次记录linked list的开头,用while语句每次寻找linked list的尾部前一个数(不找尾部是因为linked list只知道next node,所以在尾部时,我们不知道尾部的上一个node是什么),然后target,即尾部node,是我们移动的目标,改变其指向到linked list开头,然后cur 指向None(cur变成尾部node了),最后更新start pointer指向新的开头,即target。重复上述步骤k次。
1 | class Solution: |
很明显,算法的时间复杂度是O(k*n) n is the length of linked list. 乍看之下不算高,但是遇到k很大的情况肯定会超时,而且很明显有可以提升速度的地方。比如while语句寻找end node。
所以不如先遍历一遍知道linked list长度,然后k 用长度取模(k>length 会多转一圈)。然后cur遍历到需要cut的位置,cut后面的linked list block要被放到最前面。
1 | class Solution: |
O(2n) n is the length of linked list